<?php

/**
 * 
 * Autor				: 	Juan Jose Muñiz Juarez
 * Fecha de Creacion	: 	19/05/2012,  21:59:17
 * Version 				: 	1.0
 * Descripcion 			:
 */
   if ( !defined( "RUTA_FISICA_SISTEMA" ) )
     {
        require_once "../../../../config/Constantes.php";
     }
     
   $ruta_sistema = RUTA_FISICA_SISTEMA . "/sistema/";

   require_once $ruta_sistema . "config/base_datos/conexion.php";

class DataBaseMySQL
   {
      private static $_log;
      private $_class;
      private $_method;
      private $_line;

      public function __construct( $class, $method = null, $line = null)
         {
            $this -> _log = new Logger ( $class);
            $this -> _class = $class;
            $this -> _method = $method;
            $this -> _line = $line;
         }

      private static function getLogger($class)
         {
            if ( !self :: $_log )
               {
                  self :: $_log = new Logger ( __CLASS__);
               }
            else
               {
                  self :: $_log -> setClass ( $class );
               }
         }

      /**
       *
       * Metodo: query
       * Descripcion: Ejecuta una consulta y devuelve el resultado de la misma
       * Fecha de Creacion: 18/04/2012 15:03:48
       * Autor: Juan José Muñiz Juárez
       * params: @param unknown_type $query
       * params: @throws SQLException
       * return: return_type
       */
      public static function query($query, $class = null, $method = null, $line = null, $generar_log = true, $conexion = null)
         {
            //var_dump( $query );
            return self :: ejecutarQuery ( $query, "", ( $class == null ? __CLASS__ : $class ), ( $method == null ? __METHOD__ : $method ), ( $line == null ? __LINE__ : $line ), $generar_log, $conexion );
         }

      /**
       *
       * Metodo: delete
       * Descripcion: Ejecuta la consulta para eliminar informacion
       * Fecha de Creacion: 18/04/2012 15:03:53
       * Autor: Juan José Muñiz Juárez
       * params: @param unknown_type $query
       * return: return_type
       */
      public static function delete($query, $class = null, $method = null, $line = null, $generar_log = true, $conexion = null)
         {
            return self :: ejecutarQuery ( $query, "delete", ( $class == null ? __CLASS__ : $class ), ( $method == null ? __METHOD__ : $method ), ( $line == null ? __LINE__ : $line ), $generar_log, $conexion );
         }

      /* (non-PHPdoc)
       * @see OpcionBDInterface::update()
       */
      public static function update($query, $class = null, $method = null, $line = null, $generar_log = true, $conexion = null)
         {
            return self :: ejecutarQuery ( $query, "update", ( $class == null ? __CLASS__ : $class ), ( $method == null ? __METHOD__ : $method ), ( $line == null ? __LINE__ : $line ), $generar_log, $conexion );
         }

      /**
       *
       * Metodo: ejecutarQuery
       * Descripcion: Ejecuta la consulta select, delete, insert o update
       * Fecha de Creacion: 18/04/2012 15:10:39
       * Autor: Juan José Muñiz Juárez
       * params: @param unknown_type $query
       * params: @param unknown_type $method
       * params: @param unknown_type $line
       * params: @throws SQLException
       * params: @return resource
       * return: resource
       */
      private static function ejecutarQuery($query, $accion, $class, $method, $line, $generar_log = true, $conexion = null)
         {
            if ( $generar_log )
               {
                  self :: getLogger ( $class );
               }

               
            //var_dump( $query );
            //var_dump( "conexion", $conexion );   
            // TODO Auto-generated method stub
            if ( !$query )
               {
                  throw new SQLException ( "No se ha especificado el valor de la query");
               }

            if ( $accion != null && $accion != "" )
               {
                  if ( strpos ( strtolower ( $query ), strtolower ( $accion ) ) === false )
                     {
                        throw new SQLException ( "La query [ $query ] no contiene la sentencia $accion para ejecutar");
                     }
               }

            try 
              {
                    // var_dump( $conexion );
                     $resultado = mysql_query ( $query, $conexion ? $conexion : Conexion :: getConexion ( $class ) );
      
                     if ( $generar_log )
                        {
                           self :: $_log -> info ( "Ejecutando la siguiente query: <label class='query'>[ $query ] </label>", $method, $line );
                        }
      
                     if ( !$resultado )
                        {
                           self :: $_log  -> warn (  "Ocurrio un error al ejecutar la siguiente query: <label class='query'>[ $query ]</label>" . PHP_EOL 
                                                   . " <label class='error'>Codigo : </label><label class='info_error'>" . mysql_errno ( ) . "</label>" . PHP_EOL
                                                   . " <label class='error'>Error : </label> <label class='info_error'>" . mysql_error ( ) . "</label>" . PHP_EOL, $method, $line );
                        }
              }
            catch ( Exception $ex ) 
              {
                if ( $generar_log )
                  {
                     self :: $_log -> warn (  "Ocurrio un error al ejecutar la siguiente query: [ $query ] " . PHP_EOL 
                                             . " <label class='error'>Codigo :  </label><label class='info_error'>" . $ex -> getCode ( ) . "</label>" . PHP_EOL
                                             . " <label class='error'>Archivo : </label> <label class='info_error'>" . $ex -> getFile ( ) . "</label>" . PHP_EOL 
                                             . " <label class='error'>Linea : </label> <label class='info_error'>" . $ex -> getLine ( ) . "</label>" . PHP_EOL 
                                             . " <label class='error'>Traza : </label> <label class='info_error'>" . $ex -> getTrace ( ) . "</label>" . PHP_EOL 
                                             . " <label class='error'>Error : </label> <label class='info_error'>"
                                             . $ex -> getMessage ( ) . "</label>", $method, $line );
                  }

                 return null;
              }

            return $resultado;
         }

      /**
       *
       * Metodo: insert
       * Descripcion: Ejecuta la consutal insert
       * Fecha de Creacion: 18/04/2012 15:31:38
       * Autor: Juan José Muñiz Juárez
       * params: @param unknown_type $query
       * params: @return resource
       * return: resource
       */
      public static function insert( $query, $class = null, $method = null, $line = null, $generar_log = true )
         {
            return self :: ejecutarQuery ( $query, "insert", ( $class == null ? __CLASS__ : $class ), ( $method == null ? __METHOD__ : $method ), ( $line == null ? __LINE__ : $line ), $generar_log );
         }

      /**
       *
       * Nombre         	: 	getArrayResult
       * Descripcion   	:
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	03/05/2012, 23:22:34
       * @param unknown_type $resultados
       * @return multitype:
       */
      public static function getArrayResult( $resultados, $asociativo = true, $class = null, $method = null, $line = null )
         {
            if ( $asociativo )
               {
                  return mysql_fetch_assoc ( $resultados );
               }
            else
               {
                  return mysql_fetch_row ( $resultados );
               }
         }

      /**
       *
       * Nombre         	: 	getNumeroRegistros
       * Descripción   	:
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	15/05/2012, 18:22:26
       * params: @param unknown_type $resultados
       * params: @return number
       * return: number
       */
      public static function getNumeroRegistros( $resultados, $class = null, $method = null, $line = null)
         {
            return mysql_num_rows ( $resultados );
         }

      /**
       *
       * Nombre         	: 	getNumeroCampos
       * Descripción   	:
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	15/05/2012, 18:22:29
       * params: @param unknown_type $resultados
       * params: @return number
       * return: number
       */
      public static function getNumeroCampos( $resultados, $class = null, $method = null, $line = null )
         {
            return mysql_num_fields ( $resultados );
         }
   }